﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo;
using SIGEB.Modelo.moduloEstadisticas;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Prototipo.control;

namespace SIGEB.Prototipo.Control
{
    public class controlEstadisticas
    {
        public controlEstadisticas(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #region "metodos"

        internal LinkedList<datoEstadistico> obtenerDatos(DateTime inicial, DateTime final, int dias)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            if (!Validacion.mayor(final, inicial, false))
            {
                throw new Exception("rango de fechas no aceptado");
            }
            return cp.datos.estadisticas.datosPrueba(inicial, final, dias);
        }

        internal LinkedList<datoEstadistico> usoBiblioteca(DateTime inicial, DateTime final, int dias, int medida)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            if (!Validacion.mayor(final, inicial, false))
            {
                throw new Exception("rango de fechas no aceptado");
            }
            return cp.datos.estadisticas.usoBiblioteca(inicial, final, dias, medida);
        }

        internal LinkedList<grupo> obtenerGrupos()
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            return cp.datos.grupos.obtenergrupos();
        }

        internal LinkedList<datoEstadistico> usoBibliotecaGrupo(DateTime inicial, DateTime final, int dias, string idGrupo, int medida)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            if (!Validacion.mayor(final, inicial, false))
            {
                throw new Exception("rango de fechas no aceptado");
            }
            return cp.datos.estadisticas.usoBibliotecaGrupos(inicial, final, dias, idGrupo, medida);
        }

        internal LinkedList<datoEstadistico> usoBibliotecaUsuario(DateTime inicial, DateTime final, int dias, string idUsuario, int medida)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                if (cp.usuarioActualPuede(acciones.ESTADISTICA_ACT) && cp.UsuarioActual == idUsuario)
                {
                }
                else
                {
                    return null;
                }
            }
            return cp.datos.estadisticas.usoBibliotecaUsuario(inicial, final, dias, idUsuario, medida);
        }

        internal LinkedList<datoEstadistico> ingresoDocumentos(DateTime inicial, DateTime final, int dias, int medida)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            if (!Validacion.mayor(final, inicial, false))
            {
                throw new Exception("rango de fechas no aceptado");
            }
            return cp.datos.estadisticas.ingresoDocumentos(inicial, final, dias, medida);
        }

        internal LinkedList<datoEstadistico> usoPorGrupos(DateTime inicial, DateTime final, int dias, LinkedList<string> grupos, int medida)
        {
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                return null;
            }
            if (!Validacion.mayor(final, inicial, false) && grupos != null && grupos.Count < 0)
            {
                throw new Exception("rango de fechas o grupos invalidos");
            }
            try
            {
                LinkedList<datoEstadistico> listaFinal = cp.datos.estadisticas.usoBibliotecaGrupos(inicial, final, dias, grupos.ElementAt(0), medida);
                for (int i = 1; i < grupos.Count; i++)
                {
                    try
                    {
                        LinkedList<datoEstadistico> actual = cp.datos.estadisticas.usoBibliotecaGrupos(inicial, final, dias, grupos.ElementAt(i), medida);
                        for (int j = 0; j < listaFinal.Count; j++)
                        {
                            listaFinal.ElementAt(j).cantidad += actual.ElementAt(j).cantidad;
                        }
                    }
                    catch { }
                }
                return listaFinal;
            }
            catch
            {
                return null;
            }

        }

        public LinkedList<usuario> obtenerUsuarios()
        {
            LinkedList<usuario> lista;
            if (!cp.usuarioActualPuede(acciones.ESTADISTICA_TOD))
            {
                if (cp.usuarioActualPuede(acciones.ESTADISTICA_ACT))
                {
                    lista = new LinkedList<usuario>();
                    lista.AddLast(cp.usuarioActual());
                    return lista;
                }
                else
                {
                    return null;
                }
            }
            return cp.datos.usuarios.obtenerTodos();
        }

        #endregion

        #region "atributos"

        controlPrincipal cp;
        public static int DIAS = 1;
        public static int SEMANAS = 2;
        public static int MES = 3;
        public static int ANIO = 4; 

        #endregion
    }
}
